package com.springboot.module.user.utils.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Component
@Aspect //当前类为切面类
@Slf4j
public class RecordTimeAspect {
    //环绕通知
    @Around("execution(* com.springboot.module.user.service.user.UserServiceImpl.*(..))")
    public Object recordTime(ProceedingJoinPoint pjp) throws Throwable {
        //记录方法执行开始时间
        long begin = System.currentTimeMillis();
        log.debug("执行原始方法之前");
        //执行原始方法
        Object result = pjp.proceed();


        log.debug("执行原始方法之后");
        //记录方法执行结束时间
        long end = System.currentTimeMillis();

        //计算方法执行耗时
        log.debug("方法执行耗时: {}毫秒",end-begin);
        return result;
    }

    //前置通知
    @Before("@annotation(com.springboot.module.user.utils.aop.LogOperation)")
    public void before(JoinPoint joinPoint){
        log.info("before ...");
    }
    //后置通知
    @After("execution(* com.springboot.module.user.service.user.UserServiceImpl.*(..))")
    public void after(JoinPoint joinPoint){
        log.info("after ...");
    }

    //返回后通知（程序在正常执行的情况下，会执行的后置通知）
    @AfterReturning("execution(* com.springboot.module.user.service.user.UserServiceImpl.*(..))")
    public void afterReturning(JoinPoint joinPoint){
        log.info("afterReturning ...");
    }

    //异常通知（程序在出现异常的情况下，执行的后置通知）
    @AfterThrowing("execution(* com.springboot.module.user.service.user.UserServiceImpl.*(..))")
    public void afterThrowing(JoinPoint joinPoint){
        log.info("afterThrowing ...");
    }
}